unit MainRecordFr;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, Buttons, DBCtrls, StdCtrls, ComCtrls, ActnList, MainFr, DataRecord;

type

  { TMainRecordFrame }

  TMainRecordFrame = class(TMainFrame)
    RecordDBNavigator: TDBNavigator;
    FecharAction: TAction;
    CancelarAction: TAction;
    SalvarAction: TAction;
    AlterarAction: TAction;
    ExcluirAction: TAction;
    InserirAction: TAction;
    LocalizarAction: TAction;
    RecordImageList: TImageList;
    RecordActionList: TActionList;
    PrincipalGroupBox: TGroupBox;
    RecordToolBar: TToolBar;
    LocalizarButton: TToolButton;
    ToolButton1: TToolButton;
    ToolButton10: TToolButton;
    ToolButton11: TToolButton;
    ToolButton12: TToolButton;
    ToolButton2: TToolButton;
    InserirButton: TToolButton;
    ExcluirButton: TToolButton;
    AlterarButton: TToolButton;
    SalvarButton: TToolButton;
    CancelarButton: TToolButton;
    ToolButton8: TToolButton;
    FecharButton: TToolButton;
    /// Ação de Alterar
    procedure AlterarActionExecute(Sender: TObject);
    /// Ação de Cancelar
    procedure CancelarActionExecute(Sender: TObject);
    /// Controla a habilitação dos botões
    procedure ControlaBotoes(); virtual;
    /// Ação de Excluir
    procedure ExcluirActionExecute(Sender: TObject);
    /// Ação de Fechar
    procedure FecharActionExecute(Sender: TObject);
    /// Ação de Inserir
    procedure InserirActionExecute(Sender: TObject);
    /// Ação de Localizar
    procedure LocalizarActionExecute(Sender: TObject);
    /// Ação de Salvar
    procedure SalvarActionExecute(Sender: TObject);
    /// Grava o DataRecord no DataSet
    procedure SetDataRecord(Data: TDataRecord); override;
  private
    /// Frame de busca
    FSearchFrame: TMainFrame;
  public
    /// Frame de busca
    property SearchFrame: TMainFrame read FSearchFrame write FSearchFrame;
  end;

implementation

uses Initializator, MainDM;

{ TMainRecordFrame }

procedure TMainRecordFrame.ControlaBotoes();
var
  I: integer;
begin
  // Desabilita todas as ações
  for I := 0 to RecordActionList.ActionCount - 1 do begin
    TAction(RecordActionList.Actions[I]).Enabled := False;
  end;
  // Habilita apenas localizar e fechar
  LocalizarAction.Enabled := True;
  FecharAction.Enabled := True;
  // Verifica se o frame possui módulo de dados
  if (MainDataModule.DataSetState() = mdsDisable) then begin
    // Se não tiver desabilita todos os componentes
    for I := 0 to Self.ComponentCount - 1 do
      if Self.Components[I] is TControl then
        TControl(Self.Components[I]).Enabled := False;
  end else begin
    // Verifica se o DataSet está em modo de edição e controla habilitação das ações
    if (MainDataModule.DataSetState() = mdsEditing) then begin
      SalvarAction.Enabled := True;
      CancelarAction.Enabled := True;
    end else begin
      InserirAction.Enabled := True;
      if (MainDataModule.DataSetState() = mdsCanEdit) then begin
        ExcluirAction.Enabled := True;
        AlterarAction.Enabled := True;
      end;
    end;
  end;
end;

procedure TMainRecordFrame.AlterarActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Coloca o DataSet em modo de edição
    MainDataModule.Edit();
  ControlaBotoes();
end;

procedure TMainRecordFrame.CancelarActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Cancela as alterações no DataSet
    MainDataModule.Cancel();
  ControlaBotoes();
end;

procedure TMainRecordFrame.ExcluirActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Confirma exclusão
    if MessageDlg('Excluir?', 'Confirma a exclusão do registro atual?', mtConfirmation, mbYesNo, 0) = mrYes then begin
      // Apaga o registro atual
      MainDataModule.Delete();
    end;
  ControlaBotoes();
end;

procedure TMainRecordFrame.FecharActionExecute(Sender: TObject);
begin
  // Solicita ao controle para fechar o frame
  TheControl.BackFrame();
end;

procedure TMainRecordFrame.InserirActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Coloca o DataSet em modo de inserção
    MainDataModule.Insert();
  ControlaBotoes();
end;

procedure TMainRecordFrame.LocalizarActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui fram de busca
  if (SearchFrame <> nil) then
    // Exibe o frame de busca
    TheControl.ShowSearchFrame(TMainFrame(SearchFrame));
end;

procedure TMainRecordFrame.SalvarActionExecute(Sender: TObject);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Confirma as alterações no DataSet
    MainDataModule.Post();
  ControlaBotoes();
end;

procedure TMainRecordFrame.SetDataRecord(Data: TDataRecord);
begin
  // Verifica se o frame possui módulo de dados
  if (MainDataModule <> nil) then
    // Atribui um DataRecord ao DataSet
    MainDataModule.SetDataRecord(Data);
end;

initialization
  {$I mainrecordfr.lrs}

end.
